perm filename PUPSAI.SAI[S,HE] blob
sn#721897 filedate 1983-08-01 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 ENTRY NameLookup
C00008 ENDMK
C⊗;
ENTRY NameLookup;
BEGIN "PUPSUB"
REQUIRE "PUPDEF[HDR,HE]" SOURCE_FILE;
COMMENT Subroutines for using PUP.
Allan Miller 4/83;
PROCEDURE SNOOZE(INTEGER TIME(0));
Comment sleeps for 1/60 of a second (until next tick, I guess);
Comment unless argument is nonzero, then it sleeps that many seconds;
BEGIN "SNOOZE"
QUICK_CODE "SLEEP"
MOVE '13,TIME;
CALLI '13,'31
END "SLEEP";
END "SNOOZE"; Comment what a kludge;
INTERNAL PROCEDURE NAMELOOKUP(STRING NAME; INTEGER ARRAY HOSTSOCKET;
REFERENCE BOOLEAN FOUND; REFERENCE STRING ERRMESS);
COMMENT Call the name server to look up the name NAME. If found, return
FOUND=TRUE and return the first host/socket found in HOSTSOCKET[0..5].
If not found, return FOUND=FALSE and the returned error message in
ERRMESS. ;
BEGIN "NAMELOOKUP"
EXTERNAL INTEGER _SKIP_;
INTEGER ARRAY PUP[0:MAXPUPWORDS];
INTEGER ARRAY MTP[0:6];
INTEGER OPCODE,COUNT,BRCHAR,EOF,LEN,PUPCHN,I,PTR,NCHAR;
BOOLEAN GOTIT;
PUPCHN ← GETCHAN;
EOF ← 1;
OPEN(PUPCHN,"PUP",'15,0,0,COUNT,BRCHAR,EOF);
IF EOF NEQ 0 THEN
BEGIN
FOUND ← FALSE;
ERRMESS ← "OPEN failed on PUP";
END
ELSE BEGIN
COMMENT Set up an MTAPE to open a connection with the misc. services;
MTP[0] ← PUPLISTEN; COMMENT Function;
MTP[2] ← -1; COMMENT Local socket number (generate one);
MTP[3] ← 0; COMMENT Wait flag;
MTP[4] ← 8; COMMENT Byte size;
MTP[5] ← MISCSERV; COMMENT Remote socket number (misc. services);
MTP[6] ← -1; COMMENT Remote host (broadcast);
COMMENT Set up MTAPE uuo...;
OPCODE ← '072000000000 + (PUPCHN LSH 23);
CODE(OPCODE,MTP[0]);
IF MTP[1] NEQ 0 THEN
BEGIN
FOUND ← FALSE;
ERRMESS ← "Failed to connect to name server";
END
ELSE BEGIN
COMMENT Set up the PUP to send the name request;
NCHAR ← LENGTH(NAME);
DPB(NCHAR+PUPOVERHEAD,POINT(16,PUP[0],15)); COMMENT Length in bytes;
DPB(NAMEREQUEST,POINT(16,PUP[0],31)); COMMENT PUP type;
FOR I ← 1 STEP 1 UNTIL 4 DO PUP[I] ← 0; COMMENT Let WAITS fill in the rest;
PTR ← POINT(8,PUP[5],-1);
FOR I ← 1 STEP 1 UNTIL NCHAR DO IDPB(LOP(NAME),PTR);
ARRYOUT(PUPCHN,PUP[0],(NCHAR+PUPOVERHEAD+3) DIV 4);
IF EOF NEQ 0 THEN
BEGIN
FOUND ← FALSE;
ERRMESS ← "Output to PUP failed";
END
ELSE BEGIN
COMMENT Get reply from misc. server;
MTP[0] ← SKIPREADY;
CODE(OPCODE,MTP[0]);
IF _SKIP_ = 0 THEN
BEGIN
SNOOZE(0);
CODE(OPCODE,MTP[0]);
IF _SKIP_ = 0 THEN
BEGIN
SNOOZE(1);
CODE(OPCODE,MTP[0]);
IF _SKIP_ = 0 THEN
GOTIT ← FALSE
ELSE
GOTIT ← TRUE
END
ELSE
GOTIT ← TRUE
END
ELSE
GOTIT ← TRUE;
IF NOT GOTIT THEN
BEGIN
FOUND ← FALSE;
ERRMESS ← "No reply from name server";
END
ELSE BEGIN
COMMENT Receive the PUP;
ARRYIN(PUPCHN,PUP[0],MAXPUPWORDS);
COMMENT Extract PUP type, check if successful;
IF LDB(POINT(8,PUP[0],31)) = NAMEREPLY THEN
BEGIN
FOUND ← TRUE;
PTR ← POINT(8,PUP[5],-1);
FOR I ← 0 STEP 1 UNTIL 5 DO HOSTSOCKET[I] ← ILDB(PTR);
END
ELSE
BEGIN
FOUND ← FALSE;
LEN ← LDB(POINT(16,PUP[0],15))-PUPOVERHEAD;
PTR ← POINT(8,PUP[5],-1);
ERRMESS ← NULL;
FOR I ← 1 STEP 1 UNTIL LEN DO ERRMESS ← ERRMESS & ILDB(PTR);
END;
END END END END;
RELEASE(PUPCHN);
END "NAMELOOKUP";
END "PUPSUB"